// -*- C++ -*-
/*!
 * @file  CvProcessor.h * @brief Sequence OutPort component * @date  $Date$
 *
 * $Id$
 */
#ifndef CVPROCESSOR_H
#define CVPROCESSOR_H

#include <rtm/idl/BasicDataTypeSkel.h>
#include <rtm/Manager.h>
#include <rtm/DataFlowComponentBase.h>
#include <rtm/CorbaPort.h>
#include <rtm/DataInPort.h>
#include <rtm/DataOutPort.h>

// Service implementation headers
// <rtc-template block="service_impl_h">
#include <opencv/cv.h>
#include "ImgSkel.h"
#include "CvProcessorService_impl.h"
// </rtc-template>

// Service Consumer stub headers
// <rtc-template block="consumer_stub_h">

// </rtc-template>

using namespace RTC;

class CvProcessor  : public RTC::DataFlowComponentBase
{
public:
    CvProcessor(RTC::Manager* manager);
    ~CvProcessor();

    // The initialize action (on CREATED->ALIVE transition)
    // formaer rtc_init_entry()
    virtual RTC::ReturnCode_t onInitialize();

    // The finalize action (on ALIVE->END transition)
    // formaer rtc_exiting_entry()
    // virtual RTC::ReturnCode_t onFinalize();

    // The startup action when ExecutionContext startup
    // former rtc_starting_entry()
    // virtual RTC::ReturnCode_t onStartup(RTC::UniqueId ec_id);

    // The shutdown action when ExecutionContext stop
    // former rtc_stopping_entry()
    // virtual RTC::ReturnCode_t onShutdown(RTC::UniqueId ec_id);

    // The activated action (Active state entry action)
    // former rtc_active_entry()
    // virtual RTC::ReturnCode_t onActivated(RTC::UniqueId ec_id);

    // The deactivated action (Active state exit action)
    // former rtc_active_exit()
    virtual RTC::ReturnCode_t onDeactivated(RTC::UniqueId ec_id);

    // The execution action that is invoked periodically
    // former rtc_active_do()
    virtual RTC::ReturnCode_t onExecute(RTC::UniqueId ec_id);

    // The aborting action when main logic error occurred.
    // former rtc_aborting_entry()
    // virtual RTC::ReturnCode_t onAborting(RTC::UniqueId ec_id);

    // The error action in ERROR state
    // former rtc_error_do()
    // virtual RTC::ReturnCode_t onError(RTC::UniqueId ec_id);

    // The reset action that is invoked resetting
    // This is same but different the former rtc_init_entry()
    // virtual RTC::ReturnCode_t onReset(RTC::UniqueId ec_id);

    // The state update action that is invoked after onExecute() action
    // no corresponding operation exists in OpenRTm-aist-0.2.0
    // virtual RTC::ReturnCode_t onStateUpdate(RTC::UniqueId ec_id);

    // The action that is invoked when execution context's rate is changed
    // no corresponding operation exists in OpenRTm-aist-0.2.0
    // virtual RTC::ReturnCode_t onRateChanged(RTC::UniqueId ec_id);


protected:
    // Configuration variable declaration
    // <rtc-template block="config_declare">

    // </rtc-template>

    // DataInPort declaration
    // <rtc-template block="inport_declare">

    // </rtc-template>

    // DataOutPort declaration
    // <rtc-template block="outport_declare">
    Img::TimedMultiCameraImage m_MultiCameraImage;
    InPort<Img::TimedMultiCameraImage> m_MultiCameraImageIn;
    OutPort<Img::TimedMultiCameraImage> m_MultiCameraImageOut;
    RTC::CorbaPort m_CvProcessorServicePort;
    CvProcessorService_impl m_service0;

    // </rtc-template>

    // CORBA Port declaration
    // <rtc-template block="corbaport_declare">

    // </rtc-template>

    // Service declaration
    // <rtc-template block="service_declare">

    // </rtc-template>

    // Consumer declaration
    // <rtc-template block="consumer_declare">

    // </rtc-template>

private:
    IplImage* m_frame;
    IplImage* m_hsv_frame;
    IplImage* m_thresholded;
    CvMemStorage* m_storage;

    int m_H_min;
    int m_S_min;
    int m_V_min;
    int m_H_max;
    int m_S_max;
    int m_V_max;

    // for HoughCircles
    int m_CircleRadius_min;
    int m_CircleRadius_max;
    int m_distance_min;
    int m_param1;
    int m_param2;
    float* m_point;

    // for HoughLines
    double m_lines_rho;
    double m_lines_theta;
    double m_lines_threshold;
    double m_lines_min_length;
    double m_lines_max_gap;


public:
    CvSeq* m_circles;
    std::vector<cv::Vec4i> m_lines;
    CvSeq* m_faces;
    void HoughCircles(int id);
    void HoughLinesP(int id);
    void detectFaces(int id, bool doSaveImage);
};


extern "C"
{
DLL_EXPORT void CvProcessorInit(RTC::Manager* manager);
};

#endif // CVPROCESSOR_H

